package com.weixin.util;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import net.sf.json.JSONObject;

/**
 * 此工具类主要用于封装对文件的上传和下载功能
 * @author samsung
 *
 */
public class FileUtils {
	/**
	 * 文件的上传，返回上传的文件ID
	 * @param url 文件上传的url
	 * @param path 本地文件路径
	 * @return 文件ID
	 * @throws IOException 
	 */
	public static JSONObject upload(String Type,String url,String path) throws IOException{
		File file=new File(path);
		//判断文件是否存在
		if(!file.exists()||!file.isFile()){
			throw new IOException("文件不存在");
		}
		//上传文件的url
		url=url.replaceFirst("ACCESS_TOKEN", AccessTokenUtils.getAccessToken("").getAccessToken());
		url=url.replaceFirst("TYPE", Type);
		
		//进行连接url
		URL urlObj=new URL(url);
		HttpURLConnection conn=(HttpURLConnection) urlObj.openConnection();
		
		//设置连接的一些属性
		conn.setRequestMethod("POST");//设置请求方式
		conn.setDoOutput(true);
		conn.setDoInput(true);
		conn.setUseCaches(false);//post方式需要将缓存设置为false
		
		//设置头信息
		conn.setRequestProperty("Connection", "Keep Alive");
		conn.setRequestProperty("Charset", "UTF-8");
		
		//设置边界
		String BOUNDARY="----------------"+System.currentTimeMillis();
		conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+BOUNDARY);
		
		StringBuilder sb=new StringBuilder();
		sb.append("---");
		sb.append(BOUNDARY);
		sb.append("\r\n");
		sb.append("Content-Disposition:form-data;name=\"file\";filename=\""+file.getName()+"\"\r\n");
		sb.append("Content-Type:application/octet-stream\r\n\r\n");
		
		byte[] head=sb.toString().getBytes();
		
		//获得输出流
		OutputStream out=new DataOutputStream(conn.getOutputStream());
		//输出表头
		out.write(head);
		
		//文件正文部分
		//把文件已流形式输出到conn中
		InputStream in=new DataInputStream(new FileInputStream(file));
		int bytes=0;
		byte[] bufferOut=new byte[1024];
		while((bytes=in.read(bufferOut))!=-1){
			out.write(bufferOut, 0, bytes);
		}
		in.close();
		
		//结尾部分   写入完毕
		byte[] byteEnd=("\r\n--"+BOUNDARY+"--\r\n").toString().getBytes();
		out.write(byteEnd);
		out.flush();
		out.close();
		
		StringBuffer buffer=new StringBuffer();
		BufferedReader reader=null;
		String result=null;
		try{
			reader=new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
			String line=null;
			while((line=reader.readLine())!=null){
				buffer.append(line);
			}
			result=buffer.toString();
		}catch(Exception e){
			System.out.println("文件工具类上传方法："+e);
			return null;
		}
		JSONObject jsondata=JSONObject.fromObject(result);
		System.out.println("上传文件返回数据为："+jsondata.toString());
		return jsondata;
	}
}
